from public import print_1
import os
print_1('os.path.exists 函数用于判断一个指定路径的文件或者目录是否存在')
"""
import os
os.path.exists("path")
"""

print_1('文件的打开')
"""
open 函数用于创建新文件或打开已经存在的文件，语法格式为：file_obj = open("file_name", mode='r', buffering=-1, encoding=None)

file_obj：表示要创建的文件对象；
file_name：表示要创建或打开文件的文件名称，该名称要用引号括起来。需要注意的是，如果要打开的文件和当前执行的代码文件位于同一目录，则直接写文件名即可；否则，此参数需要指定打开文件所在的完整路径。
mode：可选参数，用于指定文件的打开模式，如果不写，则默认以只读 r 模式打开文件；
buffering：可选参数，用于指定对文件做读写操作时是否使用缓冲区；通常情况下使用 open 函数时打开缓冲区，即不需要修改 buffing 参数的值；
encoding：可选参数，手动设定打开文件时所使用的编码格式，不同平台的 ecoding 参数值也不同，默认采用 GBK 编码。
"""
"""
文件的打开模式:
访问模式	        说明	                                                                                                        注意事项
r（*常用）	    只读模式打开文件，读文件内容的指针会放在文件的开头，如果文件不存在，则会发生错误。	                                         操作的文件必须存在
rb（*常用）	    以二进制格式、采用只读模式打开文件，读文件内容的指针位于文件的开头，一般用于非文本文件，如图片文件、音频文件等	                操作的文件必须存在
r+	            打开文件后，既可以从头读取文件内容，也可以从开头向文件中写入新的内容，写入的新内容会覆盖文件中等长度的原有内容	                操作的文件必须存在
rb+（*常用）	    以二进制格式、采用读写模式打开文件，读写文件的指针会放在文件的开头，通常针对非文本文件（如音频文件）	                        操作的文件必须存在
w（*常用）	    打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在，创建新文件。	                                        若文件存在，会清空其原有内容（覆盖文件）；反之，则创建新文件
wb	            以二进制格式、只写模式打开文件，一般用于非文本文件（如音频文件）	                                                    若文件存在，会清空其原有内容（覆盖文件）；反之，则创建新文件
w+	            打开文件后，会对原有内容进行清空，并对该文件有读写权限	                                                            若文件存在，会清空其原有内容（覆盖文件）；反之，则创建新文件
wb+	            以二进制格式、读写模式打开文件，一般用于非文本文件	                                                                若文件存在，会清空其原有内容（覆盖文件）；反之，则创建新文件
a	            以追加模式打开一个文件，对文件只有写入权限，如果文件已经存在，文件指针将放在文件的末尾（即新写入内容会位于已有内容之后）；反之，则会创建新文件	\
ab	            以二进制格式打开文件，并采用追加模式，对文件只有写权限。如果该文件已存在，文件指针位于文件末尾（新写入文件会位于已有内容之后）；反之，则创建新文件	\
a+	            以读写模式打开文件；如果文件存在，文件指针放在文件的末尾（新写入文件会位于已有内容之后）；反之，则创建新文件	\
ab+	            以二进制模式打开文件，并采用追加模式，对文件具有读写权限，如果文件存在，则文件指针位于文件的末尾（新写入文件会位于已有内容之后）；反之，则创建新文件	\
"""
print_1('文件对象的常用属性')
"""
file_obj.name：返回文件的名称；
file_obj.mode：返回打开文件时，采用的文件打开模式；
file_obj.encoding：返回打开文件时使用的编码格式；
file_obj.closed：判断文件是否己经关闭。
"""
file_obj = open("hello.txt", "a+", encoding='utf-8')
file_obj.close()
print(file_obj.name)
print(file_obj.mode)
print(file_obj.encoding)

print(file_obj.closed)

print_1("文件的读取")
"""
Python 提供了 3 种函数实现读取文件中数据的操作：

read 函数：逐个字节或者字符读取文件中的内容；
readline 函数：逐行读取文件中的内容；
readlines 函数：一次性读取文件中多行内容。
"""
print_1('文件的写入')
"""
write 函数：写入字符串或字节串，只有以二进制模式（b 模式）打开的文件才能写入字节串；
writelines 函数：写入多个字符串或多个字节串。
"""

print_1('seek 函数和 tell 函数')
"""
tell 函数用于判断文件指针当前所处的位置，语法格式为：file_obj.tell()，其中，file_obj 表示文件对象。
"""
# 原文件包含内容：Welcome to Wuhan!
file_obj = open("hello.txt", "r")
# print(file_obj.tell())
# print(file_obj.read(3))
# print(file_obj.tell())

"""
seek 函数用于将文件指针移动至指定位置，语法格式为：file_obj.seek(offset, whence)
"""
# 原文件包含内容：123456789123456789.
file_obj = open("hello1.txt", "rb")
# 判断文件指针的位置
print(file_obj.tell())
# 读取一个字节，文件指针自动后移1个数据
print(file_obj.read(1))
print(file_obj.tell())
# 将文件指针从文件开头，向后移动到 5 个字符的位置
file_obj.seek(5)
print(file_obj.tell())
print(file_obj.read(1))
# 将文件指针从当前位置，向后移动到 5 个字符的位置
file_obj.seek(5, 1)
print(file_obj.tell())
print(file_obj.read(1))
# 将文件指针从文件结尾，向前移动到距离 2 个字符的位置
file_obj.seek(-1, 2)
print(file_obj.tell())
print(file_obj.read(1))


print_1('使用 with 语句打开文件')
"""
with 语句会在代码块执行之前自动调用一个指定对象的上下文管理器，执行完代码块后不用关闭文件，自动释放该上下文管理器所占用的资源，从而简化了资源管理的代码，并可以保证资源被正确释放，避免了因为忘记关闭资源而导致的一些问题，语法格式为：
"""
# 原文件包含内容：123456789123456789.
with open("hello1.txt", "r", encoding="utf-8") as file_obj:
    a = file_obj.read(5)
    print(a)


print_1('os 模块', True)
"""
os 模块是 Python 中整理文件和目录（文件夹）最为常用的模块，该模块提供了非常丰富的方法用来处理文件和目录（文件夹），在调用 os 模块中的函数之前需
要先导入 os 模块，导入 os 模块的语法格式为：import os，常用的 os 模块函数有：（1）os.rename 函数、（2）os.remove 函数、（3）os.mkdir 
函数、（4）os.makedirs 函数、（5）os.getcwd 函数、（6）os.chdir 函数、（7）listdir 函数、（8）os.rmdir 函数、（9）os.walk 函数、
（10）os.sep 函数。
"""
print_1('os.rename 函数')
"""
os.rename 函数用于重命名文件和目录（文件夹），如果指定的路径是文件，则重命名文件；反之，如果执行的路径是目录（文件夹），则重命名目录（文件夹），语法格式为：os.rename("path_before", "path_after")，其中，path_before 参数用于指定要进行重命名的目录（文件夹）或文件；path_after 参数用于指定重命名后的目录（文件夹）或文件。
"""
print_1('os.remove 函数')
"""
os.remove 函数用于删除指定路径的文件，如果指定的路径是一个目录，将抛出 OSError，语法格式为：os.remove("path")，其中，path 表示指定文件的路径。
"""
print_1('os.mkdir 函数')
"""
os.mkdir 函数用于创建一级目录（文件夹），语法格式为：os.mkdir("path_first")，其中，path_first 表示需要创建的一级目录（文件夹）的路径。
"""
print_1('os.makedirs 函数')
"""
os.makedirs 函数用于创建多级目录（文件夹），语法格式为：os.makedirs("path_multiple")，其中，path_multiple 表示需要创建的多级目录（文件夹）的路径 。
"""
print_1('os.getcwd 函数')
"""
os.getcwd 函数用于获得程序运行的当前目录（文件夹）所在位置，语法格式为：os.getcwd()
"""
print("当前目录：", os.getcwd())

print_1('os.chdir 函数')
"""
os.chdir 函数用于将当前工作目录（文件夹）切换到指定的路径，语法格式为：os.chdir("path_new")，其中，path_new 表示要切换到的新的指定路径。
"""
print_1('listdir 函数')
"""
listdir 函数用于打印指定路径中存在的所有文件的名称列表，语法格式为：os.listdir("path")，其中，path 表示指定路径。
"""
import os
a = os.listdir(os.getcwd())
print(a)

print_1('os.rmdir 函数')
"""
os.rmdir 函数用于删除指定路径的空目录（文件夹），如果目录不存在或不为空，则会分别抛出 FileNotFoundError 或 OSError 异常，
语法格式为：os.rmdir("path")，其中，path 表示存在且为空的目录（文件夹）。
"""

print_1('os.walk 函数')
"""
os.walk 函数用来扫描某个指定目录下所包含的子目录和文件，对于根于目录顶部（包括顶部本身）的树中的每个目录，
它都会生成一个三元组（目录路径，目录名，文件名），即返回的是（root, dirs, files），语法格式为：
"""
print_1('os.sep 函数')
"""
os.sep 函数用于根据所处的平台，自动采用相应的分隔符号：在 Windows 中，文件路径的分隔符为 \，在Linux 中，文件路径的分隔符为 /，
语法格式为："component1" + os.sep + "component2" +...+ os.sep + "componentn"，其中，componentn 表示路径组件。
"""

print_1('os.path 模块', True)
"""
os.path 模块不仅提供了一些操作路径字符串的方法，还包含一些指定文件属性的方法，在调用 os.path 模块中的函数之前需要先导入 os 模块，
导入 os 模块的语法格式为：import os，常用的 os.path 模块函数有：
（1）os.path.exists 函数、
（2）os.path.join 函数、
（3）os.path.split 函数、
（4）os.path.dirname 函数、
（5）os.path.basename 函数、
（6）os.path.isdir 函数、
（7）os.path.isfile 函数、
（8）os.path.getsize 函数、
（9）os.path.abspath 函数、
（10）os.path.getatime 函数、
（11）os.path.getctime 函数。
"""
print_1('用于判断给定的文件或目录是否存在')
# a = os.path.exists("C:\\Users\\****\\Desktop\\A1")
print_1('用于实现文件路径组件的拼接')
print(os.path.join("PyCharm", "Exercise", "Demo"))
print(os.path.join("PyCharm", "\Exercise", "Demo"))
print(os.path.join("PyCharm", "\Exercise", "\Demo"))

print_1('用于根据文件路径将文件名和目录分割开')
a = os.path.split("C:\\Users\\****\\Desktop\\books\\book.txt")
print(a)
b = os.path.split("C:\\Users\\****\\Desktop\\books\\")
print(b)
print_1('用于根据文件路径去掉文件名，返回路径名')
a = os.path.dirname("C:\\Users\\****\\Desktop\\books\\book.txt")
print(a)
b = os.path.dirname("C:\\Users\\****\\Desktop\\books\\")
print(b)
print_1('用于根据文件路径去掉路径名，返回文件名')
a = os.path.basename("C:\\Users\\****\\Desktop\\books\\book.txt")
print(a)
print_1('用于检查指定的路径是否为目录')
a = os.path.isdir("C:\\Users\\****\\Desktop\\books")
print(a)
b = os.path.isdir("C:\\Users\\****\\Desktop\\books\\book.txt")
print(b)
print_1('用于检查指定的路径是否为文件')
a = os.path.isfile("C:\\Users\\****\\Desktop\\books")
print(a)
b = os.path.isfile("C:\\Users\\****\\Desktop\\books\\book.txt")
print(b)
print_1('用于返回文件或文件夹的大小')
a = os.path.getsize("C:\\Users\\****\\Desktop\\books")
print(a)
b = os.path.getsize("C:\\Users\\****\\Desktop\\books\\zhaopian.png")
print(b)
print_1('用于返回绝对路径')
a = os.path.abspath(".")                                                # 返回当前目录的绝对路径
print(a)
b = os.path.abspath("..")                                               # 返回上级目录的绝对路径
print(b)
print_1('用于返回对指定路径的最后访问时间')
a = os.path.getatime("C:\\Users\\****\\Desktop\\books\\zhaopian.png")
print(a)








